---
sidebar_position: 6
---

# Шаг 4. Развертывание Jaeger

## Запуск контейнера Jaeger

[**Jaeger**](https://www.jaegertracing.io/) — платформа для распределенной трассировки с открытым исходным кодом. Jaeger позволяет выполнять мониторинг состояния запросов и отладку после сбоев в распределенных системах микросервисных приложений.

[Запустите Jaeger в Docker](https://www.jaegertracing.io/docs/1.50/getting-started/). Для этого используйте приведённую ниже команду Docker:

```bash
docker run --rm --name jaeger -d \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:latest
```

## Подключение Jaeger SDK

Вы можете установить [Jaeger для Python](https://www.jaegertracing.io/docs/next-release/client-libraries/), используя приведённую ниже команду:

```bash
pip install opentelemetry-exporter-jaeger
```

Затем вы можете обновить механизм трассировки в вашем файле:

```python
from flask import Flask
from random import randint
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
# highlight-start
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
# highlight-end


provider = TracerProvider()
processor = BatchSpanProcessor(ConsoleSpanExporter())
provider.add_span_processor(processor)
# highlight-start
trace.set_tracer_provider(
    TracerProvider(
        resource=Resource.create({SERVICE_NAME: "my-python-service"})
    )
)
jaeger_exporter = JaegerExporter(
    agent_host_name="localhost",
    agent_port=6831,
)
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(jaeger_exporter)
)
# highlight-end

tracer = trace.get_tracer(__name__)

app = Flask(__name__)


def roll():
    return randint(1, 6)


@app.route("/rolldice")
def roll_dice():
    with tracer.start_as_current_span("server_request"):
        return str(roll())

```

## Обзор пользовательского интерфейса трассировки Jaeger

Теперь вы можете повторно запустить приложение (`flask run -p 8080`) и отслеживать трассировки в Jaeger по адресу [http://localhost:16686/](http://localhost:16686/). Откройте [http://localhost:8080/rolldice](http://localhost:8080/rolldice) в своем веб-браузере и перезагрузите страницу несколько раз. Через некоторое время вы Jaeger UI можете увидеть подробную информацию о трассировке и метриках. Например, следующее:

![Jaeger UI: трассировка приложения](images/jaeger-ui-rolldice1.png)

Панель поиска:

- Вы можете использовать панель поиска для поиска трассировок с определенными свойствами.
- Из какого сервиса они поступают, какая операция была выполнена, конкретные теги, которые были включены в трассировку (например, код состояния HTTP), как долго в прошлом выполнялся поиск и ограничение количества результатов.
- Когда вы закончите определять параметры поиска на этой панели, нажмите "Найти трассировки".

Раздел результатов поиска:

- На скриншоте мы видим трассировку наших запросов к [http://localhost:8080/rolldice](http://localhost:8080/rolldice). Нажмите на нужную трассировку, чтобы перейти к ней.

Когда вы находите конкретную трассировку, в которой, по вашему мнению, может быть проблема, и нажимаете на нее, вы увидите экран, который выглядит примерно так:

![Jaeger UI: трассировка приложения](images/jaeger-ui-rolldice2.png)

Здесь вы можете найти конкретную информацию о времени выполнения, о том, какие вызовы были сделаны и их продолжительности, о конкретных свойствах, таких как код состояния HTTP, путь маршрута (в случае HTTP-вызова) и многое другое.

:::note
Хотя такой подход позволяет получить хорошее представление о вашем приложении, наиболее продвинутым способом адаптации инструментария на основе ваших требований является перекомпиляция агента с нуля. Кроме того, это позволит вам настроить функции [измерительный инструментарий](https://www.jaegertracing.io/docs/1.21/monitoring/) в соответствии с вашими требованиями.
:::
